package com.zzuli.yxy.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzuli.yxy.entity.User;
import com.zzuli.yxy.result.R;
import com.zzuli.yxy.util.TXCloudFileUtils;
import com.zzuli.yxy.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.zzuli.yxy.service.UserService;

import java.util.List;

/**
 * @auther pony
 * @create 2023-04-30 21:05
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;

    //腾讯云对象存储 路径-访问域名
    private static String url = "https://pony-1312090731.cos.ap-beijing.myqcloud.com/";
    // 头像存储的文件夹
    private static String imgPath = "yxy/images/";

    // 用户注册默认头像
    private String defaultImgUrl = "https://pony-1312090731.cos.ap-beijing.myqcloud.com/yxy/images/user-default.jpg";

    @Override
    public R getPage(Integer pageCurrent, Integer pageSize, String name) {
        // 1、查询分页信息
        Page<User> pageInfo = new Page<>(pageCurrent, pageSize);
        LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
        qw.like(name!=null, User::getNickName, name);
        Page<User> userPage = userMapper.selectPage(pageInfo, qw);
        return R.success().message("用户分页信息").data("userPage", userPage);
    }

    /**
     * 添加用户
     * @param user
     * @return
     */
    @Override
    public R addUser(User user) {
        // 1、添加用户
        //将明文密码加密后存入数据库
        if (!"".equals(user.getPassword())&&user.getPassword()!=null){
            BCryptPasswordEncoder bc = new BCryptPasswordEncoder();
            user.setPassword(bc.encode(user.getPassword()));
        }

        //设置默认头像
        user.setImg(defaultImgUrl);
        userMapper.insert(user);

        // 2、添加成功，查询数据库，查询歌手 id，并返回，以便后续上传歌手图片使用
        LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
        qw.eq(User::getNickName, user.getNickName());
        /*根据歌手名查是可能会有重复的数据的 selectOne 就会报错
        我们取最后一条数据，就是我们刚添加的数据，即根据id降序排，第一条数据*/
        qw.orderByDesc(User::getId);
        qw.last("limit 1");
        User selectResult = userMapper.selectOne(qw);
        return R.success().message("用户基本信息添加成功！").data("userId", selectResult.getId());
    }

    /**
     * 添加用户-上传用户图片
     * @param file 图片
     * @param userId 要添加图片的用户id
     * @return
     */
    @Override
    public R uploadAddImg(MultipartFile file, String  userId) {
        //1、查询数据库
        LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
        qw.eq(User::getId, userId);
        User user = userMapper.selectOne(qw);

        //2、先删除云存储桶中的 歌曲图片 文件，如果存在的话
        deleteTXCosUserImg(user);

        //3、上传文件 返回值是 key，即图片重新命名的名字
        String imgName = TXCloudFileUtils.upLoad(imgPath, file);
        //4、拼接 img 访问路径，并写入数据库
        String imgUrl = url  + imgPath + imgName;
        //5、将 img 访问路径，存到 对应 id 的歌曲的图片字段
        LambdaUpdateWrapper<User> uw = new LambdaUpdateWrapper<>();
        uw.eq(User::getId, userId);
        uw.set(User::getImg, imgUrl);
        int updateResult = userMapper.update(null, uw);
        if (updateResult!=1){
            return R.error().message("用户图片上传失败，请联系管理员");
        }
        return R.success().message("用户图片上传成功");
    }


    @Override
    public R deleteById(Integer id) {
        int delete = userMapper.deleteById(id);
        if (delete==1){
            return R.success().message("删除用户成功");
        }
        return R.error().message("系统错误，请联系管理员");
    }

    /**
     * 根据用户id，查询单个用户信息
     * @param id 用户id
     * @return
     */
    @Override
    public R selectOneById(Integer id) {
        User user = userMapper.selectById(id);
        user.setPassword(null);
        return R.success().message("单个用户数据").data("user", user);
    }

    /**
     * 修改用户信息
     * @param user
     * @return
     */
    @Override
    public R updateUser(User user) {
        LambdaUpdateWrapper<User> uw = new LambdaUpdateWrapper<>();
        uw.eq(User::getId, user.getId());
        uw.set(User::getPhone, user.getPhone());
        uw.set(User::getPassword,user.getPassword());
        uw.set(User::getNickName, user.getNickName());
        uw.set(User::getRemarks, user.getRemarks());
        uw.set(User::getImg, defaultImgUrl);
        int update = userMapper.update(user, uw);
        if (update==1){
            return R.success().message("修改用户成功").data("userId", user.getId());
        }
        return R.error().message("系统错误，请联系管理员");
    }

    @Override
    public R deleteBatch(List<Integer> ids) {
        userMapper.deleteBatchIds(ids);
        return R.success().message("批量删除成功");
    }

    /**
     * 删除云存储桶里的用户 图片
     * @param user 待删除用户
     */
    public void deleteTXCosUserImg(User user){
        /*最初爬虫的图片数据没有存到云存储桶 是网易的图片 不需要删，也删不了
        singerImg：http://p1.music.126.net/AAKrMZu-zyunLRqAMO9JlA==/109951166577890720.jpg?param=130y130
        而本系统添加的歌曲时，图片是存储在云存储桶里的，需要删除
        singerImg：https://pony-1312090731.cos.ap-beijing.myqcloud.com/yxy/images/20230414093225fcb9570a89b44a1c94421e8239bbe3cf.jpg
        */
        String userImg = user.getImg();

        // 删除云存储桶里的歌曲图片
        if (userImg!=null && !"".equals(userImg)&& !userImg.equals(defaultImgUrl)){
            //删除云存储桶里的歌曲 图片（网易的不用删）, 只需要判断是否以 https 开头就行
            if (userImg.startsWith("https")){

                //songImgKey: 20230414093225fcb9570a89b44a1c94421e8239bbe3cf.jpg
                String userImgKey = userImg.substring(userImg.indexOf("images/")+7);
                //文件夹名 + songImgKey yxy/images/20230414093225fcb9570a89b44a1c94421e8239bbe3cf.jpg
                TXCloudFileUtils.del(imgPath+userImgKey);
            }
        }
    }
}
